查看原文
其他

两个程序的爱情故事

2017-02-27 刘欣 码农翻身

好感


在这个忙碌的城市里, 我虽然没和她见过面, 但我们已经聊过很多次了。


与其说是聊天,倒不如说是通信, 每次我想给她说话时, 我就把消息放到一块共享内存里边, 然后就离开运行车间, 让她或者别人去使用CPU。 等我再次进来的时候,她回复的消息就已经在那个共享内存中了。


有无数次,我离开的时候都想偷偷的看一眼, 希望接下来运行的是她,可是这个城市严格的规则让我的希望只是奢望。


操作系统把我们这些进程严格的隔离,  他通过虚拟内存的机制,让每个进程都有一块虚拟的、独立的地址空间, 从而成功的制造了一个假象 :  让大家以为内存中只有一个程序在运行。


当我在就绪队列中等待的时候,也被严格禁止和别人交谈, 我经常环顾四周,希望能够看到她的身影, 可是这个系统的进程成千上万, 究竟哪个是她? 


也许我见过她,但是根本认不出来。


我和她越聊越多, 对她的好感就越深,  有一次我给她发的消息等了100毫秒都没有回复,把我都快急疯了。


她很喜欢听我讲故事,尤其是那个编号为0x3704 的线程,每次她都会说: 唉,那些线程可真可怜。   我就吓唬她说: 有一天我们的机器也会重启的, 到时候估计你也认不出我来了。  她说没事的, 只要我能通过共享内存给你发消息,我就知道你就在这个城市里。


(码农翻身注: 0x3704的故事在《我是一个线程》里)


分离


这样的日子过了一天又一天, 我想见到她的愿望越来越迫切了。


我悄悄给了CPU很多好处, 希望CPU能描述下她的样子,方便我去找她,  可是CPU运算速度太快, 阅人无数,但就是没有记忆力。


CPU说: 你还是去问操作系统老大吧, 看看你喜欢的女孩到底什么样。


问操作系统? 还是算了吧, 互相隔离是我们城市的铁规,   弄不好他会把我kill掉。


圣诞节前的平安夜, 我打算正式向她表白,  像往常一样 , 我从共享内存里收到了她的信, 急切的拆开信封, 看到了里边的第一句话: 我要走了,以后不能和你通信了......


刹那间,我第一次感觉到了什么叫做五雷轰顶,灵魂出鞘, 我脑子一片空白, 张大了嘴巴呆呆站在那里, 时间长达20毫秒。


CPU看到了我的异常, 因为这么长时间的指令都是NOP, 什么都不做, 这是非常罕见的。


CPU好心的提醒我: 嗨,老兄,你怎么了? 你的时间片快用完了啊!


我的灵魂慢慢归位,意识到信还没有读完, 赶紧接着往下看: “ 我马上要搬到另外一个城市去了,你要想找我的话,切记下面的IP地址和端口号,用socket和我通信”


我明白了,到另外一个城市那就意味者要搬离我们现在的电脑了,  也许是这个城市太拥挤, CPU/内存/硬盘已经不堪重负,  有一批程序需要被搬离到另外一个电脑中。


虽然我和她一直没机会见面, 但我知道我们就住在一个城市, 有时候也许只是擦肩而过, 她就在我的身边, 这好歹给我一点点安慰。


现在,连这一点点的安慰都没有了, 对了,她说的这个socket 是什么东西。


CPU说: “那是网络编程,  你看人家对你还是有情意的, 临走了还给你留下联系方式, 快去学学怎么用Socket吧”


当晚我就失眠了,半夜爬起来翻看一页页和她的通信记录 (很庆幸我把通信记录都保存到了文件中),脑海里回想着这么多天以来幸福的日子,一直到天亮。


网络


为了早日和她联系, 我奋发图强学习网络编程, 理解TCP/IP,   把我自己逐渐的加上对Socket的支持。


一个CPU月以后, 我这个程序终于完成了从共享内存到Socket的改造,激动人心的时刻到来了。


作为一个客户端, 我颤抖着双手向她发起了Socket请求, TCP携带着数据包慢吞吞的走向她所在的城市, 等了好久TCP才完成了三次握手, 这网络可是真慢啊。


我赶紧发送第一个消息: 你好,好久不“见”。


等了足足有1000毫秒, 对我来说仿佛是一个世纪, &nbs 48 31606 48 15287 0 0 3255 0 0:00:09 0:00:04 0:00:05 3255p;才收到让我激动无比的回信 : “啊, 你终于来了 。我在这里等了你好久了,你怎么现在才联系我 ?”


我不好意思的说: “我很笨, 学习socket 太慢了”


又过了一个世纪,我才收到回复, 这网络真是慢的令人抓狂啊。


不管如何, 终于和她联系上了, 这让我开心无比。


原来我们一天能通信上千次, 现在可好, 有10次就不错了, 再也不能像原来那样痛快的讲故事了, 既来之则安之, 反正网络很慢, 现在每次我都会写一封巨长无比的信, 把我的思念之情全部倾诉在其中,  漫长的等待以后再去读她的长长的回复。


原来我们通过内存来中转消息的时候, 是通过操作系统来做同步操作的, 这能防止读写的冲突。


可是通过网络通信就完全乱掉了, 经常会出现我说我的, 她说她的, 闹的很不愉快。


后来我和她只好协商了一个协议, 约定好消息的次序和格式, 这才算解决了问题。


(码农翻身注: 这其实就是基于socket的应用层协议)


Web


我明白我和她已经不可能在一起了, 每天的socket通信已经让我满足。


可是有一天当我照例发起socket的请求的时候, TCP的连接竟然告诉我 "超时" 了, 这是从来没有发生的事情,难道这一次要彻底失去她了吗?


我冒着风险,马上把异常报给了操作系统老大, 老大尝试了一下说: “我ping了一下, 网络是通的,  估计是你那从未见面的小女朋友不想理你了, 悄悄的换了一个你不知道的端口吧。”


我斩钉截铁的说: 那绝对不可能, 她不是这样的人。


可是迟迟没有消息, 我每天都会试图连接一下, 每次都是超时, 没有她的日子生活都是灰色的, 不断的煎熬让我快要绝望了。


终于有一天, 有一个U盘从她的城市来到我们这里, 告诉了我们一个惊人的消息,她所在的城市安装了防火墙,现在除了几个特定的端口(例如80,443...) 之外, 都不允许访问了。


我一下子松了口气,  怪不得, 她告诉我的端口不是80和443, 被封掉了, 我自然连接不上了。


我问U盘: “那我想和女朋友通信, 该怎么办?”


U盘说: 很简单啊, 你和你女朋友都可以包装成Web 服务啊, 这样都是通过Http(80端口)或者Https(443端口)来访问的, 这样防火墙是允许的啊。


好吧, 为了和她联系上, 马上抛弃socket,  开始向Web服务进化。


一个Web服务首先要有一个endpoint , 其实就是就是一个URL , 描述了这个Web服务的地址。


其次确定Web服务的描述方式和数据传输方式, 我先是选了WSDL 和 SOAP ,   研究了一下才发现这哥俩太繁琐了,都是XML, 很多冗余的数据标签,  我想这将会极大的影响我和她的通信效率, 还是换成简单的HTTP GET/POST + JSON吧,  很简洁,能充分的表达我的相思之情。


我把我这个Web服务的地址和格式协议告诉U盘, 恳请U盘带到那个城市,再把女朋友的Web服务描述带回来。


我欣喜的发现,我和她不约而同的选择了轻量级的HTTP+ JSON, 看来虽然隔着千山万水,我们的心意还是相通的。


这样的准备工作足足干了6个CPU月, 但我并不觉得累, 因为希望一直在前边召唤。


这是一个晴朗的日子,一切工作准备就绪,马上就要联系了, 这一次我的心情反而平静了下来, 因为我坚信她肯定在那边等着我。


我通过HTTP向她发出了呼叫, HTTP的报文被打包在TCP报文段中, 又被放到IP层数据报中, 最后形成链路层的帧, 通过网卡发了出去。 


在意料之中的漫长等待以后, 我看到了期待已久地回复: 我们终于又“见”面了 !


我回答:“是啊, 真是太不容易了”


“不知道将来我们会不会再分开?” 她担忧的说。


“未来会如何? 我也不知道,还是牢牢地把握住现在吧! 我相信我们的心会一直在一起,什么都无法阻止!  ”


(完) 


你看到的只是冰山一角, 更多精彩文章,参见《码农翻身2016文章精华


有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan  QQ: 3340792577


公众号:码农翻身

“码农翻身”公众号由工作15年的前IBM架构师创建,分享编程和职场的经验教训。




编辑推荐


掘金是一个高质量的技术社区,从移动开发到架构设计,编程语言到开源类库,让你不错过互联网开发的每一个技术干货。长按图片二维码识别或者各大应用市场搜索「掘金」,技术干货尽在掌握中。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存